package com.cty.controller;

import com.cty.pojo.Demo;
import com.cty.pojo.Demo2;
import com.cty.pojo.People;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * @Auther: cty
 * @Date: 2020/3/12 17:14
 * @Description:  控制器  获取参数
 * @version: 1.0
 */
@Controller
public class DemoController {
    // 1 参数是基本数据类型
    // 1.1 默认要求方法参数名称与请求参数名一致
    @RequestMapping("demo")
    public String demo(String name, int age){
        System.out.println("执行demo: "+name+" "+age);
        return "demo.jsp";
    }

    // 1.2 请求参数名与方法参数名不对应时
    @RequestMapping("demo2")
    public String demo2(@RequestParam(value = "name") String name1, @RequestParam("age")int age1){
        System.out.println("执行demo2: "+name1+" "+age1);
        return "demo.jsp";
    }

    // 1.3 设置默认值(当参数为null时)
    @RequestMapping("demo3")
    public String demo3(@RequestParam(defaultValue = "people") String name, @RequestParam(defaultValue = "3")int age){
        System.out.println("执行demo3: "+name+" "+age);
        return "demo.jsp";
    }

    // 1.4 强制必须有某个参数
    @RequestMapping("demo4")
    public String demo4(@RequestParam(required = true) String name, @RequestParam(required = true)int age){
        System.out.println("执行demo4: "+name+" "+age);
        return "demo.jsp";
    }

    // 2 方法参数是对象时, 要求类属性名与请求参数名一致
    @RequestMapping("demo5")
    public String demo5(People peo){
        System.out.println("执行demo5: "+peo.getName()+" "+peo.getAge());
        return "demo.jsp";
    }

    // 3 请求参数中包含多个同名参数时(如复选框传递的参数)
    @RequestMapping("demo6")
    public String demo6(String name, int age, @RequestParam("hobby") List<String> abc){
        System.out.println("执行demo6: "+name+" "+age+" "+abc);
        return "demo.jsp";
    }

    // 4 请求参数名为"对象.属性"格式时
    @RequestMapping("demo7")
    public String demo7(Demo demo){
        System.out.println("执行demo7: "+demo);
        return "demo.jsp";
    }

    // 5 请求参数名为"对象.属性"格式, 且传递的时对象列表时
    @RequestMapping("demo8")
    public String demo8(Demo2 demo){
        System.out.println("执行demo8: "+demo);
        return "demo.jsp";
    }

    // 6 restful传值方式--自定义格式
    @RequestMapping("demo9/{name}/{age}")
    public String demo9(@PathVariable String name,@PathVariable("age") int age1){
        System.out.println("执行demo9: "+name+" "+age1);
        return "/demo.jsp";  // 注意要使用绝对路径!
    }

    // 7 跳转方式
    // 请求转发：return forward:资源路径  or  return 资源路径
    // 重定向：return redirect:资源路径

    @RequestMapping("demo10")
    public String demo10(){
        System.out.println("执行demo10: ");
        return "forward:demo.jsp";  // 请求转发
    }
    @RequestMapping("demo11")
    public String demo11(){
        System.out.println("执行demo11: ");
        return "redirect:demo.jsp";  // 重定向
    }

    // 8 自定义视图解析器(简化代码)
    // 配置内容见springmvc.xml
    // 若希望不执行自定义视图解析器, 在方法返回值前面添加forward:或redirect:
    @RequestMapping("demo12")
    public String demo12(){
        System.out.println("执行demo12: ");
        return "redirect:demo.jsp";  // 结合自定义视图解析器，实际跳转地址为 /demo.jsp
    }

    // 9 使用ResponseBody注解实现不跳转，而是响应客户端
    // 在方法上添加 @ResponseBody (恒不跳转)
    //      如果返回值满足 key-value 形式(对象或map)
    //          把响应头设置为 application/json;charset=utf-8
    //          把转换后的内容输出流的形式响应给客户端
    //      如果返回值不满足 key-value，例如返回值为String
    //          把相应头设置为 text/html
    //          把方法返回值以流的形式直接输出
    //          如果返回值包含中文，出现中文乱码
    @RequestMapping("demo13")
    @ResponseBody
    public People demo13(){
        System.out.println("执行demo13: ");
        People peo = new People();
        peo.setName("张三");
        peo.setAge(23);
        return peo;  // 返回值满足key-value形式
    }

    // produces 表示响应头中 Content-Type 取值，不设置会出现中文乱码
    @RequestMapping(value = "demo14", produces = "text/html;charset=utf-8")
    @ResponseBody
    public String demo14() {
        System.out.println("执行demo14: ");
        return "你好";  // 返回值不满足key-value 形式
    }
}
